#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <signal.h>

// 发送信号
// int kill(pid_t pid, int sig);

// typedef void (*sighandler_t)(int);
// SIG_IGN忽略   SIG_DFL默认

// 捕捉信号监听信号 signum信号值  handler回调函数
// sighandler_t signal(int signum, sighandler_t handler);
void sighandler1(int arg)
{
    printf("捕捉到信号 arg:%d\n", arg);
}
int main()
{
    printf("main \n");

    pid_t pid = fork();

    if (pid == -1)
    {
        printf("创建进程失败 \n");
    }

    if (pid == 0) // 子进程
    {
        // 捕获信号  异步的（不阻塞）
        signal(SIGUSR1, sighandler1);

        printf("子进程 \n");
        pause(); // 阻塞等待信号
        printf("end\n");
        exit(11);
    }

    if (pid > 0) // 父进程 但是返回的ID号表示的是子进程的ID号
    {

        sleep(5);
        kill(pid, SIGUSR1);

        sleep(3);
        kill(pid, SIGKILL);

        int status;
        wait(&status);
        printf("%d  %d %d %d\n", WIFEXITED(status), WEXITSTATUS(status), WIFSIGNALED(status), WTERMSIG(status));
    }

    return 0;
}
